package com.southwind.controller;


import com.southwind.entity.Book;
import com.southwind.entity.Borrow;
import com.southwind.service.BookService;
import com.southwind.service.BorrowService;
import com.southwind.vo.AdminBorrowVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 */
/**
 * 管理员控制层，处理与管理员相关的页面跳转及业务逻辑操作。
 * 主要包括页面重定向、用户注销、借阅列表展示、审批借阅请求等功能。
 *
 */
@Controller
@RequestMapping("/admin")  // 定义该控制器处理所有/admin开头的请求映射
public class AdminController {

    // 自动注入借阅服务和图书服务，用于调用业务逻辑方法
    @Autowired
    private BorrowService borrowService;
    @Autowired
    private BookService bookService;

    /**
     * 页面重定向方法，根据URL参数动态跳转到指定的管理员界面。
     *
     * @param url 跳转的目标页面路径
     * @return 重定向后的页面路径
     */

    @GetMapping("/{url}")
    public String redirect(@PathVariable("url") String url){
        return "/admin/"+url;
    } // 返回拼接后的视图名称，实现页面跳转

    /**
     * 用户注销方法，清除session信息并返回登录页面。
     *
     * @param session 当前用户的HttpSession
     * @return 登录页面的视图名称
     */

    @GetMapping("/logout")
    public String logout(HttpSession session){
        session.invalidate(); // 清空session
        return "login"; // 重定向到登录页面
    }

    /**
     * 加载借阅列表页面，并传递借阅信息VO列表给前端展示。
     *
     * @param model Spring MVC的Model对象，用于向视图传递数据
     * @return 借阅列表页面的视图名称
     */

    @GetMapping("/borrowList")
    public String borrowList(Model model){
        List<AdminBorrowVO> adminBorrowVOList = this.borrowService.adminBorrowList(); // 获取借阅列表
        model.addAttribute("list", adminBorrowVOList); // 将借阅列表放入模型
        return "/admin/borrow"; // 返回借阅列表页面
    }

    /**
     * 批准借阅请求，更新借阅状态为已批准，并重定向回借阅列表页面。
     *
     * @param id 借阅记录的ID
     * @return 重定向至借阅列表的指令
     */

    @GetMapping("/allow")
    public String allow(Integer id){
        Borrow borrow = this.borrowService.getById(id); // 获取借阅记录
        borrow.setStatus(1); // 设置状态为已批准
        this.borrowService.updateById(borrow); // 更新借阅记录状态
        return "redirect:/admin/borrowList";  // 重定向到借阅列表
    }

    /**
     * 拒绝借阅请求，更新借阅状态为已拒绝，同时归还书籍数量，并重定向回借阅列表页面。
     *
     * @param id 借阅记录的ID
     * @return 重定向至借阅列表的指令
     */

    @GetMapping("/notAllow")
    public String notAllow(Integer id){
        Borrow borrow = this.borrowService.getById(id); // 获取借阅记录
        borrow.setStatus(2); // 设置状态为已拒绝
        this.borrowService.updateById(borrow); // 更新借阅记录状态
        Book book = this.bookService.getById(borrow.getBid());  // 获取相关书籍
        book.setNumber(book.getNumber()+1); // 增加书籍数量
        this.bookService.updateById(book); // 更新书籍数量
        return "redirect:/admin/borrowList";  // 重定向到借阅列表
    }

}

